JDBC:Java DataBase Connect,即Java数据库连接,我们可以用它来操作关系型数据库。
JDBC的Statement:
Statement是JDBC中用来执行数据库SQL查询语句的接口。通过调用连接对象的getStatement()方法可以生成一个Statement对象,我们可以通过调用它的execute()、executeQuery()、executeUpdate()方法来执行静态SQL查询。
Statement的execute(String query)方法用来执行任意的SQL查询,如果查询的结果是一个ResultSet,这个方法就返回true,如果不是ResultSet,比如insert或者update语句,他就会返回false,我们可以通过它的getResultSet方法来获取ResultSet,或者通过getUpdateCount()方法来获取更新的记录条数。
Statement的executeQuery(String query)接口用来执行select查询,并且返回ResultSet。即使查询不到记录返回的ResultSet也不会为null。我们通常使用executeQuery来执行查询语句,这样的话如果传进来的是insert或者update语句的话,它会抛出错误信息为 “executeQuery method can not be used for update”的java.util.SQLException。
Statement的executeUpdate(String query)方法用来执行insert或者update/delete(DML)语句,或者 什么也不返回DDL语句。返回值是int类型,如果是DML语句的话,它就是更新的条数,如果是DDL的话,就返回0。
只有当你不确定是什么语句的时候才应该使用execute()方法,否则应该使用executeQuery或者executeUpdate方法。
PreparedStatement:PreparedStatement对象代表的是一个预编译的SQL语句,用它提供的setter方法可以传入查询的变量。由于PreparedStatement是预编译的,通过它可以将对应的SQL语句高效的执行多次。
通过Statement的getGeneratedKeys()方法可以获取表自动生成的主键
脏读:当我们使用事务时,有可能会出现这样的情况,有一行数据刚更新,与此同时另一个查询读到了这个刚更新的值。这样就导致了脏读,因为更新的数据还没有进行持久化,更新这行数据的业务可能会进行回滚,这样这个数据就是无效的。
数据库的TRANSACTIONREADCOMMITTED,TRANSACTIONREPEATABLEREAD,和TRANSACTION_SERIALIZABLE隔离级别可以防止脏读。
幻读:指一个事务多次执行一条查询返回的却是不同的值,假设一个事务正根据某个条件进行数据查询,然后另一个事务插入了满足这个查询条件的语句,之后这个事务再次执行了这条查询,返回的结果集中会包含刚插入的那条新数据,这行新数据被称为幻行,这种现象称为幻读。
只有TRANSACTION_SERIALIZABLE隔离级别才能防止产生幻读。
java.util.Date和java.sql.Date有什么区别?
java.util.Date包含日期和时间,而java.sql.Date只包含日期信息,而没有具体的时间信息。如果你想把时间信息存储在数据库里,可以考虑使用Timestamp或者DateTime字段。
JDBC里的CLOB和BLOB数据类型分别代表什么?
CLOB即Character Large Objects,字符大对象,它是由单字节字符组成的字符串数据,这种数据类型适用于存储超长的文本信息,那么可能会超出标准的VARCHAR数据类型长度限制的文本。
BLOB即Binary Large Objects,它是二进制大对象,由二进制数据组成,它能用于存储超过VARBINARY限制的二进制数据,这种数据类型适合存储图片、声音、图形或者其他业务程序特定的数据。
数据库的隔离级别:当我们为了数据的一致性使用事务时,数据库系统用锁来防止别人访问事务中用到的数据,数据库通过锁来防止脏读、不可重复读以及幻读等问题。
数据库使用JDBC设置的隔离级别来决定使用何种锁机制,我们可以通过Connection的getTransactionIsolation和setTransactionIsolation方法来获取和设置数据库的隔离级别。
| 隔离级别 | 事务 | 脏读 | 不可重复读 | 幻读 |
| —————————- | —- | —- | —– | —- |
| TRANSACTION_NONE | 不支持 | 不可用 | 不可用 | 不可用 |
| TRANSACTION_READ_COMMITTED | 支持 | 阻止 | 允许 | 允许 |
| TRANSACTION_READ_UNCOMMITTED | 支持 | 允许 | 允许 | 允许 |
| TRANSACTION_REPEATABLE_READ | 支持 | 阻止 | 阻止 | 允许 |
| TRANSACTION_SERIALIZABLE | 支持 | 阻止 | 阻止 | 阻止 |